package user

import (
	"context"
	"goAdminV1/internal/model"
	"golang.org/x/crypto/bcrypt"

	"github.com/gogf/gf/v2/errors/gerror"

	"goAdminV1/api/user/v1"
)

// UserUpdate 处理用户更新
func (c *ControllerV1) UserUpdate(ctx context.Context, req *v1.UserUpdateReq) (*v1.UserUpdateRes, error) {
	// 查询用户是否存在
	user, err := model.GetUserById(ctx, req.Id)
	if err != nil {
		return nil, gerror.New("查询用户失败")
	}
	if user == nil {
		return nil, gerror.New("用户不存在")
	}

	// 更新用户基本信息
	updateData := map[string]interface{}{
		"username": req.Username,
		"email":    req.Email,
	}

	// 处理密码更新（如果提供了新密码）
	if req.Password != "" {
		hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
		if err != nil {
			return nil, gerror.New("密码加密失败")
		}
		updateData["password"] = string(hashedPassword)
	}

	// 处理部门 ID 更新（如果提供了）
	if req.DepartmentId > 0 {
		updateData["department_id"] = req.DepartmentId
	}

	// 更新用户数据
	if err := model.UpdateUser(ctx, req.Id, updateData); err != nil {
		return nil, gerror.New("更新用户失败")
	}

	// 重新关联角色
	if err := model.DeleteUserRoles(ctx, req.Id); err != nil {
		return nil, gerror.New("删除用户角色失败")
	}
	if len(req.Roles) > 0 {
		if err := model.InsertUserRoles(ctx, req.Id, req.Roles); err != nil {
			return nil, gerror.New("更新用户角色失败")
		}
	}

	// 重新关联岗位
	if err := model.DeleteUserJobs(ctx, req.Id); err != nil {
		return nil, gerror.New("删除用户岗位失败")
	}
	if len(req.Jobs) > 0 {
		if err := model.InsertUserJobs(ctx, req.Id, req.Jobs); err != nil {
			return nil, gerror.New("更新用户岗位失败")
		}
	}

	// 返回成功响应
	return &v1.UserUpdateRes{
		UserId:  req.Id,
		Message: "用户更新成功",
	}, nil
}
